<?php


namespace data\extend\cdkjt;

use think\Config;

/**
 * 成都跨境贸易
 * Class Cdkjt
 * @package data\extend\cdkjt
 */
class Cdkjt
{
    private $config = [];
    
    public function __construct()
    {
        $this->config = Config::get('cdkjt');
    }

    /**
     * 支付数据申报
     *
     * @param string guid 企业系统生成36位唯一序号（英文字母大写）。
     * @param int appType 企业报送类型。1-新增 2-变更
     * @param string appTime 企 业 报 送 时 间 。 格式:YYYYMMDDhhmmss。
     * @param int appStatus 业务状态:1-暂存,2-申报
     * @param string payCode 支付企业的海关注册登记编号
     * @param string payName 支付企业在海关注册登记的名称
     * @param string payTransactionId 支付企业唯一的支付流水号
     * @param string orderNo 企交易平台的订单编号，同一交易平台的订单编号应唯一。订单编号长度不能超过60位
     * @param string ebpCode 电商平台的海关注册登记编号；电商平台未在海关注册登记，由电商企业发送订单的，以中国电子口岸发布的电商平台标识编号为准
     * @param string ebpName 电商平台的海关注册登记名称；电商平台未在海关注册登记，由电商企业发送订单的，以中国电子口岸发布的电商平台名称为准
     * @param int payerIdType 1-身份证,2-其它。限定为身份证，填写“1”
     * @param string payerIdNumber 支付人的身份证件号码
     * @param string payerName 支付人的真实姓名
     * @param string telephone 支付人的电话号码
     * @param float amountPaid 支付金额
     * @param string currency 限定为人民币，填写“142”
     * @param string payTime 支 付 时 间 ， 格式:YYYYMMDDhhmmss
     * @param string note 备注
     *
     * @return mixed|string
     */
    public function payment($data){
        $xml = '<ceb:Payment>
            <ceb:PaymentHead>
            <ceb:guid>'.$data['guid'].'</ceb:guid>
            <ceb:appType>'.$data['appType'].'</ceb:appType>
            <ceb:appTime>'.date('YmdHis').'</ceb:appTime>
            <ceb:appStatus>'.$data['appStatus'].'</ceb:appStatus>
            <ceb:payCode>'.$this->config['payCode'].'</ceb:payCode>
            <ceb:payName>'.$this->config['payName'].'</ceb:payName>
            <ceb:payTransactionId>'.$data['payTransactionId'].'</ceb:payTransactionId>
            <ceb:orderNo>'.$data['orderNo'].'</ceb:orderNo>
            <ceb:ebpCode>'.$this->config['ebpCode'].'</ceb:ebpCode>
            <ceb:ebpName>'.$this->config['ebpName'].'</ceb:ebpName>
            <ceb:payerIdType>'.$data['payerIdType'].'</ceb:payerIdType>
            <ceb:payerIdNumber>'.$data['payerIdNumber'].'</ceb:payerIdNumber>
            <ceb:payerName>'.$data['payerName'].'</ceb:payerName>
            <ceb:telephone>'.$data['telephone'].'</ceb:telephone>
            <ceb:amountPaid>'.$data['amountPaid'].'</ceb:amountPaid>
            <ceb:currency>'.$data['currency'].'</ceb:currency>
            <ceb:payTime>'.$data['payTime'].'</ceb:payTime>
            <ceb:note>'.$data['note'].'</ceb:note>
            </ceb:PaymentHead>
            </ceb:Payment>';
        $xml = $this->_xml($xml);
        return $this->_curl_post($xml);
    }


    /**
     * 订单报文申报
     *
     * @param string guid 企业系统生成36位唯一序号（英文字母大写）。
     * @param int appType 企业报送类型。1-新增 2-变更
     * @param string appTime 企 业 报 送 时 间 。 格式:YYYYMMDDhhmmss。
     * @param int appStatus 业务状态:1-暂存,2-申报
     * @param string orderType 电子订单类型：I进口
     * @param string orderNo 交易平台的订单编号，同一交易平台的订单编号应唯一。订单编号长度不能超过60位
     * @param string ebpCode 电商平台的海关注册登记编号；电商平台未在海关注册登记，由电商企业发送订单的，以中国电子口岸发布的电商平台标识编号为准
     * @param string ebpName 电商平台的海关注册登记名称；电商平台未在海关注册登记，由电商企业发送订单的，以中国电子口岸发布的电商平台名称为准
     * @param string ebcCode 电商企业的海关注册登记编号
     * @param string ebcName 电商企业的海关注册登记名称
     * @param float goodsValue 商品实际成交价，含非现金抵扣金额
     * @param float freight 不包含在商品价格中的运杂费，无则填写"0"
     * @param float discount 使用积分、虚拟货币、代金券等非现金支付金额，无则填写"0"
     * @param float taxTotal 企业预先代扣的税款金额，无则填写“0”
     * @param float acturalPaid 商品价格+运杂费+代扣税款非现金抵扣金额，与支付凭证的支付金额一致
     * @param string currency 限定为人民币，填写“142”
     * @param string buyerRegNo 订购人的交易平台注册号
     * @param string buyerName 订购人的真实姓名
     * @param string buyerTelephone 海关监管对象的电话，要求实际联系电话
     * @param string buyerIdType 1-身份证,2-其它。限定为身份证，填写“1”
     * @param string buyerIdNumber 订购人的身份证件号码
     * @param string payCode 支付企业的海关注册登记编号
     * @param string payName 支付企业在海关注册登记的企业名称
     * @param string payTransactionId 支付企业唯一的支付流水号
     * @param string batchNumbers 商品批次号
     * @param string consignee 收货人姓名，必须与电子运单的收货人姓名一致
     * @param string consigneeTelephone 收货人联系电话，必须与电子运单的收货人电话一致
     * @param string consigneeAddress 收货地址，必须与电子运单的收货地址一致
     * @param string consigneeDistrict 收货地址行政区划代码,参照国家统计局公布的国家行政区划标准填制
     * @param string note 备注
     * @param string gnum 商品序号，从1开始的递增序号
     * @param string itemNo 电商企业自定义的商品货号（SKU）
     * @param string itemName 交易平台销售商品的中文名称
     * @param string gmodel 商品规格型号，满足海关归类、审价以及监管的要求为准。包括：品名、牌名、规格、型号、成份、含量、等级等
     * @param string itemDescribe 交易平台销售商品的描述信息
     * @param string barCode 国际通用的商品条形码，一般由前缀部分、制造厂商代码、商品代码和校验码组成
     * @param string unit 单位，填写海关标准的参数代码，参照《JGS-20 海关业务代码集》计量单位代码
     * @param string qty 商品实际数量
     * @param float price 商品单价。赠品单价填写为“0”
     * @param float totalPrice 商品总价，等于单价乘以数量
     * @param string currency 限定为人民币，填写“142”
     * @param string country 原产国，填写海关标准的参数代码，参照《JGS-20 海关业务代码集》-国家（地区）代码表
     * @param string currency 限定为人民币，填写“142”
     * @param string note 备注，促销活动，商品单价偏离市场价格的，可以在此说明
     * @param string keyInfo 企业身份key
     *
     */
    public function order($data){
        $xml = '<ceb:Order>
            <ceb:OrderHead>      
            <ceb:guid>'.$this->create_guid().'</ceb:guid>
            <ceb:appType>'.$data['appType'].'</ceb:appType>
            <ceb:appTime>'.date('YmdHis').'</ceb:appTime>
            <ceb:appStatus>2</ceb:appStatus>
            <ceb:orderType>I</ceb:orderType>
            
            <ceb:payCode>'.$this->config['ebpCode'].'</ceb:payCode>
            <ceb:payName>'.$this->config['ebpName'].'</ceb:payName>
            <ceb:ebpCode>'.$this->config['ebpCode'].'</ceb:ebpCode>
            <ceb:ebpName>'.$this->config['ebpName'].'</ceb:ebpName>
            <ceb:ebcCode>'.$this->config['ebcCode'].'</ceb:ebcCode>
            <ceb:ebcName>'.$this->config['ebcName'].'</ceb:ebcName>
           
            <ceb:payTransactionId>'.$data['payTransactionId'].'</ceb:payTransactionId>
            <ceb:orderNo>'.$data['orderNo'].'</ceb:orderNo>
            <ceb:goodsValue>'.$data['goodsValue'].'</ceb:goodsValue>
            <ceb:freight>'.$data['freight'].'</ceb:freight>
            <ceb:discount>'.$data['discount'].'</ceb:discount>
            <ceb:taxTotal>'.$data['taxTotal'].'</ceb:taxTotal>
            <ceb:acturalPaid>'.$data['acturalPaid'].'</ceb:acturalPaid>
            <ceb:currency>'.$data['currency'].'</ceb:currency>
            <ceb:buyerRegNo>'.$data['buyerRegNo'].'</ceb:buyerRegNo>
            <ceb:buyerName>'.$data['buyerName'].'</ceb:buyerName>
            <ceb:buyerIdType>'.$data['buyerIdType'].'</ceb:buyerIdType>
			<ceb:buyerTelephone>'.$data['buyerTelephone'].'</ceb:buyerTelephone>
            <ceb:buyerIdNumber>'.$data['buyerIdNumber'].'</ceb:buyerIdNumber>

            <ceb:consignee>'.$data['consignee'].'</ceb:consignee>
            <ceb:consigneeTelephone>'.$data['consigneeTelephone'].'</ceb:consigneeTelephone>
            <ceb:consigneeAddress>'.$data['consigneeAddress'].'</ceb:consigneeAddress>
		
            <ceb:note>'.$data['note'].'</ceb:note>
        </ceb:OrderHead>
        <ceb:OrderList>';
//	<ceb:consigneeDistrict>'.$data['consigneeDistrict'].'</ceb:consigneeDistrict>
            foreach ($data['orderList'] as $item){
                $xml .= '<ceb:gnum>'.$item['gnum'].'</ceb:gnum>
                <ceb:itemName>'.$item['itemName'].'</ceb:itemName>
                <ceb:unit>'.$item['unit'].'</ceb:unit>
                <ceb:qty>'.$item['qty'].'</ceb:qty>
                <ceb:price>'.$item['price'].'</ceb:price>
                <ceb:totalPrice>'.$item['totalPrice'].'</ceb:totalPrice>
                <ceb:currency>142</ceb:currency>
                <ceb:country>116</ceb:country>
                <ceb:gmodel>'.$item['gmodel'].'</ceb:gmodel>
                <ceb:itemNo>'.$item['itemNo'].'</ceb:itemNo>
                <ceb:itemDescribe>'.$item['itemDescribe'].'</ceb:itemDescribe>
                <ceb:note></ceb:note>';
            }

        $xml .='</ceb:OrderList>
            </ceb:Order>';

        $xml = $this->_xml($xml,'CEB311Message',true);
        //echo $xml;exit;
        return $this->_curl_post($xml);
    }


    private function _xml($xml,$cebMsg = 'CEB411Message',$keyInfo= false){
        $headerbasexml = '<?xml version="1.0" encoding="UTF-8"?>
            <ceb:'.$cebMsg.' guid="'.$this->create_guid().'"
            version="1.0" xmlns:ceb="http://www.chinaport.gov.cn/ceb"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">';

        $footerbasexml = '<ceb:BaseTransfer>
            <ceb:copCode>'.$this->config['copCode'].'</ceb:copCode>
            <ceb:copName>'.$this->config['copName'].'</ceb:copName>
            <ceb:dxpMode>DXP</ceb:dxpMode>
            <ceb:dxpId>'.$this->config['dxpId'].'</ceb:dxpId>
            <ceb:note></ceb:note>
            </ceb:BaseTransfer>';
        if($keyInfo){
            $footerbasexml .='<ceb:Authentication>
		    <ceb:keyInfo>'.$this->config['keyInfo'].'</ceb:keyInfo>
            </ceb:Authentication>';
        }
        $footerbasexml .='</ceb:'.$cebMsg.'>';
        return $headerbasexml.
            $xml.
            $footerbasexml;
    }


    //179签名
    public function getsign($data){
        $uesrinfo = strtoupper(md5($this->config['cdkjt_account'].strtoupper(md5($this->config['cdkjt_pwd']))));
        $customsRegistcode = $this->config['copCode'];
        $purpose = $this->config['ebpCode'];            //电商平台的海关注册登记编号。
        $copNo = $data['copNo'];
        $initSign = $data['signInit'];
        //$note = $data['note'];
        $note = $this->config['payCode'];
//echo $customsRegistcode.'-'.$purpose.'-'.$note;exit;
        $xml = '<?xml version="1.0" encoding="UTF-8"?>
            <ceb:CEBSignMessage xmlns:ceb="http://www.chinaport.gov.cn/ceb" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ceb:SignData>
            <ceb:userInfo>'.$uesrinfo.'</ceb:userInfo>
            <ceb:customsRegistCode>'.$customsRegistcode.'</ceb:customsRegistCode>
            <ceb:waitSignData>'.base64_encode($initSign).'</ceb:waitSignData>
            <ceb:purpose>'.$purpose.'</ceb:purpose>
            <ceb:copNo>'.$copNo.'</ceb:copNo>
            <ceb:note>'.$note.'</ceb:note>
            </ceb:SignData>
            </ceb:CEBSignMessage>';
        //echo $xml;exit;
        return $this->_curl_post($xml);
    }

    //179订单数据上传
    public function uploadOrder($str)
    {
        $url = $this->config['hgapi'];
        $postdata = 'payExInfoStr='.$str;
        $data = $this->_curl($url,$postdata);
        return json_decode($data,true);
    }




    private function _curl_post($xml){
        $url = $this->config['apiurl'];
        $post_data = http_build_query(['xml'=>$xml]);//重点
        $data = $this->_curl($url,$post_data);
        $xml = simplexml_load_string($data);
        $json = json_encode($xml);
        return json_decode($json,TRUE);
    }


    public function _curl($url,$post_data,$contentType = array('Content-Type: application/x-www-form-urlencoded'))
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, 0);//不抓取头部信息。只返回数据
        curl_setopt($curl, CURLOPT_TIMEOUT, 0);//超时设置
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//1表示不返回bool值
        curl_setopt($curl, CURLOPT_POST, 1);
        if($contentType){
            curl_setopt($curl, CURLOPT_HTTPHEADER, $contentType);//重点
        }
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
        $data = curl_exec($curl);
        if (curl_errno($curl)) {
            return curl_error($curl);
        }
        curl_close($curl);
        return $data;
    }

    public function create_guid() {
        $charid = strtoupper(md5(uniqid(mt_rand(), true)));
        $hyphen = chr(45);// "-"
        $uuid = chr(123)// "{"
            .substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12)
            .chr(125);// "}"
        $uuid = trim($uuid,'{}');
        return $uuid;
    }

    //微信支付清关
    public function wxinPaymentTo($data)
    {
        $xml = $this->arrayToXml($data);
        $url = 'https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder';
        $rs = $this->_curl($url,$xml,Array("Content-Type:text/xml; charset=utf-8"));
        $rs = (array)simplexml_load_string($rs, 'SimpleXMLElement', LIBXML_NOCDATA);
        return $rs;
    }


    function arrayToXml($arr){
        $xml = "<xml>";
        foreach ($arr as $key=>$val){
            if(is_array($val)){
                $xml.="<".$key.">".$this->arrayToXml($val)."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }


}